package br.com.playonline.persistencia;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.playonline.domain.Bolao;
import br.com.playonline.domain.TipoDeJogo;

@Component
public class BolaoHibernateDAO extends HibernateDAOGenerico<Bolao, Long> {

	@Autowired
	public BolaoHibernateDAO(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	public List<Bolao> findByTipoDeJogo(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteria(Restrictions.eq("tipoDeJogo", tipoDeJogo));
		return bolaos;
	}
	
	public List<Bolao> findByTipoDeJogoUmaCota(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteriaOrderBy(Order.desc("valorCota"),Restrictions.and(Restrictions.eq("tipoDeJogo", tipoDeJogo),Restrictions.isNotEmpty("desdobramentos"),Restrictions.eq("qtdCotas",1),Restrictions.isNotNull("desdobramentos"),Restrictions.isNull("seqSorteada"),Restrictions.neProperty("qtdCotas", "qtdCotasVendidas")));
		return bolaos;
	}

	public List<Bolao> findByTipoDeJogoVariasCotas(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteriaOrderBy(Order.desc("valorCota"),Restrictions.and(Restrictions.eq("tipoDeJogo", tipoDeJogo),Restrictions.isNotEmpty("desdobramentos"),Restrictions.ne("qtdCotas",1),Restrictions.isNotNull("desdobramentos"),Restrictions.isNull("seqSorteada"),Restrictions.neProperty("qtdCotas", "qtdCotasVendidas")));
		return bolaos;
	}
	
	public List<Bolao> findBolaoFinalizadoByTipoDeJogo(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteria(Restrictions.and(Restrictions.eq("tipoDeJogo", tipoDeJogo),Restrictions.isNotNull("seqSorteada")));
		return bolaos;
	}

	public List<Bolao> findBolaoEsperandoSorteioByTipoDeJogo(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteria(Restrictions.and(Restrictions.eq("tipoDeJogo", tipoDeJogo),Restrictions.isNull("seqSorteada")));
		return bolaos;
	}
	
	public List<Bolao> findBolaoByLiberacaoPremio(TipoDeJogo tipoDeJogo){
		List<Bolao> bolaos = findByCriteria(Restrictions.and(Restrictions.eq("tipoDeJogo", tipoDeJogo),Restrictions.isNull("valorPremio"),Restrictions.isNotNull("seqSorteada")));
		return bolaos;
	}
	
}
